// 操作数库的对象  db
// 数据库：blog_database
// 数据表：pre_user

// 导入express
const express = require("express")
const router = express.Router()
const db = require("../common/db/index")
const Jwt = require("../common/jwt")
const aes = require("../common/aes")



// 管理员登录
// 请求方式 POST
// 请求地址：http://localhost:3001/api/admin/login
// 参数：account, password
router.post("/login", async (req, res) => {
    let { account, password } = req.body;
    if (account == undefined || password == undefined) {
        res.send({
            code: -1,
            msg: "缺少参数"
        })
    }
    else {
        // 先根据明文的账户检索数据库用户表
        const sql = 'SELECT account,username,gender,imgUrl,createAt, password,tag, id FROM pre_user WHERE account = ? and role = "1"';
        await db.query(sql, [account])
            .then(
                result => {
                    // result 数组
                    if (result.length == 0) {
                        resolve({
                            msg: "不存在该用户",
                            code: 404
                        })
                    }
                    else {
                        // 解密操作
                        // 通过布尔值 判断密码是否一致                                  
                        let isLogin = aes.aesDecrypt(password, result[0].password)
                        if (isLogin) {
                            let user = result[0];//用户信息
                            // 用户id
                            let token = new Jwt(user.id).getToken();
                            res.send({
                                username: user.username,
                                account: user.account,
                                gender: user.gender,
                                createAt: user.createAt,
                                imgUrl: user.imgUrl,
                                token: token,
                                msg: "管理员账号登录成功",
                                code: 200
                            })
                        }
                        else {
                            res.send({
                                msg: "登录失败",
                                code: -1
                            })
                        }
                    }

                },
                err => {
                    res.send({
                        code: 500,
                        msg: '你不是管理员',
                        err
                    })
                }
            )
    }
})


// 修改管理员密码
// 请求方式 POST
// 请求地址：http://localhost:3001/api/admin/changePassword
// 参数：oldPassword, newPassword ,token
router.post("/changePassword", async (req, res) => {
    let { oldPassword, newPassword, token } = req.body; // 从body中获取token

    if (!oldPassword || !newPassword || !token) {
        return res.send({
            code: -1,
            msg: "缺少必要参数"
        });
    }

    let userId;
    try {
        let decoded = new Jwt(token).verifyToken();
        // console.log(decoded);
        userId = decoded.info.data;
        // console.log(userId);
    } catch (error) {
        return res.send({
            code: -1,
            msg: "令牌无效或已过期"
        });
    }

    try {
        // 查询当前用户信息
        const sql = 'SELECT password FROM pre_user WHERE id = ? AND role = "1"';
        const result = await db.query(sql, [userId]);
        // console.log(result);
        if (result.length === 0) {
            return res.send({
                code: -1,
                msg: "用户不存在"
            });
        }

        // 验证旧密码是否正确
        let isOldPasswordValid = aes.aesDecrypt(oldPassword, result[0].password);
        if (!isOldPasswordValid) {
            return res.send({
                code: -1,
                msg: "原密码错误"
            });
        }
        // 密码格式验证
        const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&.]{8,20}$/;
        if (!passwordRegex.test(newPassword)) {
            return res.send({
                code: -1,
                msg: "密码格式不正确：长度8-20位，必须包含大小写字母和数字，可选特殊字符@$!%*?&."
            });
        }

        // 加密新密码
        let encryptedNewPassword = aes.aesEncrypt(newPassword);

        // 更新密码
        const updateSql = 'UPDATE pre_user SET password = ? WHERE id = ?';
        await db.query(updateSql, [encryptedNewPassword, userId]);

        res.send({
            code: 200,
            msg: "密码修改成功"
        });
    } catch (error) {
        res.send({
            code: 500,
            msg: "服务器内部错误",
            error
        });
    }
});

module.exports = router;